// --------------------------------------------------------------------------------------------------------------------
// <copyright file="ATICommand.cs" company="Microsoft Corporation">
// The MIT License (MIT)
// 
// Copyright (c) 2014, Microsoft Corporation
// 
// Permission is hereby granted, free of charge, to any person obtaining a copy
//  of this software and associated documentation files (the "Software"), to deal
//  in the Software without restriction, including without limitation the rights
//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
//  copies of the Software, and to permit persons to whom the Software is
//  furnished to do so, subject to the following conditions:
// 
// The above copyright notice and this permission notice shall be included in
//  all copies or substantial portions of the Software.
// 
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
//  THE SOFTWARE.
// </copyright>
// --------------------------------------------------------------------------------------------------------------------

namespace Microsoft.Robotics.Hardware.Sensors.ATI
{
    /// <summary>
    /// A class for all the command related constants
    /// Reference can be found at the following url
    /// </summary>
    /// https://microsoft.sharepoint.com/teams/Baker/Shared%20Documents/Reference%20documents/Hardware%20Manual/ATI/9610-05-1022%20Manual.pdf
    public class ATICommand
    {
        /// <summary>
        /// Header data for each message sent out to the force torque sensor.
        /// Although in the document this is a unsigned short, we here use a short
        /// because IPAddress.HostToNetworkOrder does not take unsigned short as
        /// a valid argument and the number here is small enough that it does not 
        /// make a difference using signed and unsigned.
        /// </summary>
        public const short CommandHeader = 0x1234;

        /// <summary>
        /// Stop streaming force torque measurement
        /// </summary>
        public const short StopStreaming = 0x0000;

        /// <summary>
        /// Start high-speed real-time streaming
        /// </summary>
        public const short StartRealTimeStreaming = 0x0002;

        /// <summary>
        /// Start high-speed buffered streaming
        /// </summary>
        public const short StartBufferedStreaming = 0x0003;

        /// <summary>
        /// Start multi-unit streaming (synchronized)
        /// </summary>
        public const short StartMultiUnitStreaming = 0x0004;

        /// <summary>
        /// Reset threshold latch
        /// </summary>
        public const short ResetThresholdLatch = 0x0041;

        /// <summary>
        /// Set software bias for the sensor
        /// </summary>
        public const short SetSoftwareBias = 0x0042;

        /// <summary>
        /// Streaming indefinitely until asked to stop
        /// </summary>
        public const int StreamingIndefinitely = 0;

        /// <summary>
        /// Length in bytes of a single command
        /// </summary>
        public const int CommandLengthInByte = 8;

        /// <summary>
        /// Command data not in use by the sensor
        /// </summary>
        public const int NotInUse = 0;

        /// <summary>
        /// Length in bytes of a single response
        /// </summary>
        public const int ResponseLengthInByte = 36;

        /// <summary>
        /// Address of the configuration page
        /// </summary>
        public const string ConfigurationPageAddress = "netftapi2.xml";
    }
}
